# 定义编译器和编译选项
CC = gcc
CFLAGS = -Iinclude  # 指定头文件目录

# 定义目录结构
SRC_DIR = src
INCLUDE_DIR = include
OBJ_DIR = obj
ASM_DIR = asm
PREPROCESS_DIR = preprocessed
BIN_DIR = bin

# 定义目标文件和可执行文件
TARGET = $(BIN_DIR)/calculator
SRCS = $(SRC_DIR)/add.c main.c
OBJS = $(OBJ_DIR)/add.o $(OBJ_DIR)/main.o
ASMS = $(ASM_DIR)/add.s $(ASM_DIR)/main.s
PREPROCESSED = $(PREPROCESS_DIR)/add.i $(PREPROCESS_DIR)/main.i

# 默认目标：构建可执行文件
all: $(TARGET)

# 链接：生成可执行文件
$(TARGET): $(OBJS)
	@mkdir -p $(BIN_DIR)  # 确保目录存在
	$(CC) $(OBJS) -o $@
	@echo "链接完成: $@"

# 汇编：生成目标文件
$(OBJ_DIR)/add.o: $(ASM_DIR)/add.s
	@mkdir -p $(OBJ_DIR)
	$(CC) -c $< -o $@
	@echo "汇编完成: $@"

$(OBJ_DIR)/main.o: $(ASM_DIR)/main.s
	@mkdir -p $(OBJ_DIR)
	$(CC) -c $< -o $@
	@echo "汇编完成: $@"

# 编译：生成汇编文件
$(ASM_DIR)/add.s: $(PREPROCESS_DIR)/add.i
	@mkdir -p $(ASM_DIR)
	$(CC) -S $< -o $@
	@echo "编译完成: $@"

$(ASM_DIR)/main.s: $(PREPROCESS_DIR)/main.i
	@mkdir -p $(ASM_DIR)
	$(CC) -S $< -o $@
	@echo "编译完成: $@"

# 预处理：生成.i文件
$(PREPROCESS_DIR)/add.i: $(SRC_DIR)/add.c
	@mkdir -p $(PREPROCESS_DIR)
	$(CC) $(CFLAGS) -E $< -o $@
	@echo "预处理完成: $@"

$(PREPROCESS_DIR)/add.i: $(INCLUDE_DIR)/add.h

$(PREPROCESS_DIR)/main.i: main.c
	@mkdir -p $(PREPROCESS_DIR)
	$(CC) $(CFLAGS) -E $< -o $@
	@echo "预处理完成: $@"

$(PREPROCESS_DIR)/main.i: $(INCLUDE_DIR)/add.h

# 清理所有生成的文件
clean:
	rm -rf $(OBJ_DIR) $(ASM_DIR) $(PREPROCESS_DIR) $(BIN_DIR)
	@echo "已清理所有生成文件"

# 运行程序
run: $(TARGET)
	./$(TARGET)
